package com.tianji.common.autoconfigure.xxljob;

import com.tianji.common.utils.StringUtils;
import com.xxl.job.core.executor.impl.XxlJobSpringExecutor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Slf4j
@Configuration
@ConditionalOnClass(XxlJobSpringExecutor.class)
@EnableConfigurationProperties(XxlJobProperties.class)
public class XxlJobConfig {

    /**
     * 创建并配置 XXL-JOB 执行器 Bean
     * @param prop 从配置文件中注入的 XXL-JOB 配置属性
     * @return 配置好的执行器实例
     */
    @Bean
    public XxlJobSpringExecutor xxlJobExecutor(XxlJobProperties prop) {
        log.info(">>>>>>>>>>> xxl-job config init.");
        XxlJobSpringExecutor xxlJobSpringExecutor = new XxlJobSpringExecutor();

        // 配置调度中心地址
        XxlJobProperties.Admin admin = prop.getAdmin();
        if (admin != null && StringUtils.isNotEmpty(admin.getAddress())) {
            xxlJobSpringExecutor.setAdminAddresses(admin.getAddress()); // 设置调度中心HTTP地址
        }

        // 配置执行器参数
        XxlJobProperties.Executor executor = prop.getExecutor();
        if (executor != null) {
            // 应用名称（执行器注册名称）
            if (executor.getAppName() != null)
                xxlJobSpringExecutor.setAppname(executor.getAppName()); // 微服务名称
            // 执行器IP（自动获取为空时）
            if (executor.getIp() != null)
                xxlJobSpringExecutor.setIp(executor.getIp());// 当前执行器的ip和端口，无需配置，自动获取
            // 执行器端口（默认9999）
            if (executor.getPort() != null)
                xxlJobSpringExecutor.setPort(executor.getPort()); // 当前执行器的ip和端口，无需配置，自动获取
            // 日志存储路径
            if (executor.getLogPath() != null)
                xxlJobSpringExecutor.setLogPath(executor.getLogPath()); // 任务运行日志的保存目录
            // 日志保留天数
            if (executor.getLogRetentionDays() != null)
                xxlJobSpringExecutor.setLogRetentionDays(executor.getLogRetentionDays()); // 日志最长保留时长
        }

        // 设置访问令牌（与调度中心配置保持一致）
        if (prop.getAccessToken() != null)
            xxlJobSpringExecutor.setAccessToken(prop.getAccessToken()); // 访问令牌，在调度中心中配置令牌，所有执行器访问时都必须携带该令牌，否则无法访问

        log.info(">>>>>>>>>>> xxl-job config end.");
        return xxlJobSpringExecutor;
    }
}

